説明
バグレポート
画面全体でウィジェットをアニメーション化する
ユーザーが画面から移動するときにアプリ内をガイドすると役立つことがよくあります スクリーンへ。ユーザーをアプリ内に誘導する一般的な手法は、アニメーション化することです。 ウィジェットをある画面から次の画面に移動します。これにより、接続する視覚的なアンカーが作成されます。 2つの画面。
使用Hero
ウィジェット
ウィジェットをある画面から次の画面にアニメーション化します。
このレシピでは次の手順を使用します。
- 同じ画像を表示する 2 つの画面を作成します。
- 追加
Hero
ウィジェットを最初の画面に移動します。 - 追加
Hero
ウィジェットを 2 番目の画面に移動します。
1. 同じ画像を表示する 2 つの画面を作成する
この例では、両方の画面に同じ画像を表示します。 最初の画面から 2 番目の画面まで画像をアニメーション化する ユーザーが画像をタップします。ここでは、視覚的な構造を作成します。 次のステップでアニメーションを処理します。
import 'package:flutter/material.dart';
class MainScreen extends StatelessWidget {
const MainScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Main Screen'),
),
body: GestureDetector(
onTap: () {
Navigator.push(context, MaterialPageRoute(builder: (context) {
return const DetailScreen();
}));
},
child: Image.network(
'https://picsum.photos/250?image=9',
),
),
);
}
}
class DetailScreen extends StatelessWidget {
const DetailScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: GestureDetector(
onTap: () {
Navigator.pop(context);
},
child: Center(
child: Image.network(
'https://picsum.photos/250?image=9',
),
),
),
);
}
}
Hero
最初の画面へのウィジェット
2. を追加します。2 つの画面をアニメーションで接続するには、ラップします。
のImage
両方の画面のウィジェットHero
ウィジェット。
のHero
ウィジェットには 2 つの引数が必要です。
- `タグ`
- 「ヒーロー」を識別するオブジェクト。 両方の画面で同じである必要があります。
- 「子供」
- 画面全体でアニメーション化するウィジェット。
Hero(
tag: 'imageHero',
child: Image.network(
'https://picsum.photos/250?image=9',
),
)
Hero
ウィジェットを 2 番目の画面に移動
3. を追加します。最初の画面で接続を完了するには、
包むImage
2番目の画面でHero
同じものを持つウィジェットtag
としてHero
最初の画面で。
適用後、Hero
ウィジェットを 2 番目の画面に移動し、
画面間のアニメーションは正常に動作します。
Hero(
tag: 'imageHero',
child: Image.network(
'https://picsum.photos/250?image=9',
),
)
インタラクティブな例
import 'package:flutter/material.dart';
void main() => runApp(const HeroApp());
class HeroApp extends StatelessWidget {
const HeroApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
title: 'Transition Demo',
home: MainScreen(),
);
}
}
class MainScreen extends StatelessWidget {
const MainScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Main Screen'),
),
body: GestureDetector(
onTap: () {
Navigator.push(context, MaterialPageRoute(builder: (context) {
return const DetailScreen();
}));
},
child: Hero(
tag: 'imageHero',
child: Image.network(
'https://picsum.photos/250?image=9',
),
),
),
);
}
}
class DetailScreen extends StatelessWidget {
const DetailScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: GestureDetector(
onTap: () {
Navigator.pop(context);
},
child: Center(
child: Hero(
tag: 'imageHero',
child: Image.network(
'https://picsum.photos/250?image=9',
),
),
),
),
);
}
}